import request from '@/utils/request';
import * as G from '@/utils/common'
import { stringify } from 'qs';

/**
 *  执行POST请求
 *  data: 将指定参数放在body里面并且为字符串
 */
export async function doPostListList({ url, ...param }: { url: string, param: object }) {
  return request.post(`${url}`, {
    data: param.list
  });
}

/**
 *   执行GET请求
 *   params  将指定参数拼接在url之后，传参方式为 url ?
 *   例：/api/v1/xxx?id=1   或   /api/v1/xxx
 */
export async function doGet({ url, ...params }: { url: string, params?: object }) {
  return request.get(`${url}`, {
    params,
  });
}

/**
 *   执行POST请求
 *   params  将指定参数拼接在url之后，传参方式为 url ?
 *   例：/api/v1/xxx?id=1   或   /api/v1/xxx
 */
export async function doPostParam({ url, ...params }: { url: string, params?: object }) {
  return request.post(`${url}`, {
    params,
  });
}

/**
 *  执行POST请求
 *  data: 将指定参数放在body里面
 *  例1：
 *  url:  /api/v1/user
 *  data: {name: 'Mike', age: 10}
 *  例2：
 *  url:  /api/v1/user?id=1
 *  data: {name: 'Mike', age: 10}
 */
export async function doPostToObj({ url, ...params }: { url: string, params: object }) {
  return request.post(`${url}`, {
    data: params,
  });
}

export async function doPostToFormData(url: string, formData: FormData) {
  return request.post(`${url}`, {
    data: formData,
  });
}

/**
 * 执行 post 请求
 * 
 * 例：
 * url: /api/v1/page
 * params: { pageNo: 1, pageSize: 10, ... }
 * ==> /api/v1/page?pageNo=1&pageSize=10, data: {...}
 */
export async function doPostParamAndObj({ url, ...params }: { url: string, params: object }) {
  const { pagination, data } = G.separateParamAndBody(params)
  return request.post(`${url}?${stringify(pagination)}`, {
    data: data,
  })
}

/**
 *  执行POST请求
 *  data: 将指定参数放在body里面
 *  例1：
 *  url:  /api/v1/user
 *  data: [{name: 'Mike', age: 10}]
 *  例2：
 *  url:  /api/v1/user?id=1
 *  data: [{name: 'Mike', age: 10}]
 */
export async function doPostToList({ url, ...param }: { url: string, param: object }) {
  return request.post(`${url}`, {
    data: param,
  });
}

/**
 *  执行PUT方法
 *  data: 将指定参数放在body里面
 *  例1：
 *  url:  /api/v1/user
 *  data: {name: 'Mike', age: 10}
 *  例2：
 *  url:  /api/v1/user?id=1
 *  data: {name: 'Mike', age: 10}
 */
export async function doPutToObj({ url, ...params }: { url: string, params: object }) {
  return request.put(`${url}`, {
    data: params,
  });
}

/**
 *  执行PUT方法
 *  data: 将指定参数放在body里面
 *  例1：
 *  url:  /api/v1/user
 *  data: [{name: 'Mike', age: 10}]
 *  例2：
 *  url:  /api/v1/user?id=1
 *  data: [{name: 'Mike', age: 10}]
 */
export async function doPutToList({ url, list }: { url: string, list: Array<any> }) {
  return request.put(`${url}`, {
    data: list,
  });
}
/**
 *  执行POST方法
 *  data: 将指定参数放在body里面
 *  例1：
 *  url:  /api/v1/user
 *  data: [{name: 'Mike', age: 10}]
 *  例2：
 *  url:  /api/v1/user?id=1
 *  data: [{name: 'Mike', age: 10}]
 */
export async function doPostToList1({ url, list }: { url: string, list: Array<any> }) {
  return request.post(`${url}`, {
    data: list,
  });
}
/**
 *  执行DELETE方法
 *  例1：
 *  url:  /api/v1/user
 *  例2：
 *  url:  /api/v1/user?id=1
 *  例3：
 *  url:  /api/v1/user/1
 */
export async function doDelete({ url }: { url: string }) {
  return request.delete(`${url}`, {});
}


/**
 *  执行DELETE方法
 */
export async function doDeleteParam({ url, ...params }: { url: string, params?: object }) {
  return request.delete(`${url}`, {
    params,
  });
}

/**
 *  执行DELETE方法
 *  参数放在body中
 *  data: 将指定参数放在body里面
 *  例1：
 *  url:  /api/v1/user
 *  data: [{name: 'Mike', age: 10}]
 *  例2：
 *  url:  /api/v1/user?id=1
 *  data: [{name: 'Mike', age: 10}]
 */
export async function doDeleteObj({ url, ...params }: { url: string, params?: object }) {
  return request.delete(`${url}`, {
    data: params,
  });
}
